package br.com.ac.fatureweb.service;

import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.ac.fatureweb.exception.AccessNaoAutorizadoException;
import br.com.ac.fatureweb.integration.enums.EnumStatus;
import br.com.ac.fatureweb.integration.model.LeituristaVO;
import br.com.ac.fatureweb.model.Leiturista;
import br.com.ac.fatureweb.utilitary.Criptografia;
import br.com.ac.fatureweb.utilitary.NgcDefaultBean;

@Local
@Named
@Stateless
@SuppressWarnings("all")
public class NgcLeituristaBean extends NgcDefaultBean<Leiturista> {

	@PersistenceContext
	private EntityManager entityManager;

	@PostConstruct
	void inicialize() {
		setEm(entityManager);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * br.com.ac.fatureweb.utilitary.NgcDefaultBean#persist(java.lang.Object)
	 */
	@Override
	public Leiturista persist(Leiturista entity) {
		entity.setDataGeracaoSenha(new Date());
		entity.setFlgAtualizaSenha(true);
		entity.setStatus(EnumStatus.ATIVO);

		entity.setSenha(Criptografia.executeMd5(entity.getSenha()));

		entityManager.persist(entity);

		Leiturista beanCriado = entity;
		beanCriado.setCodigo(entity.getId().longValue());

		entityManager.merge(beanCriado);

		return beanCriado;
	}

	/**
	 * List all leiturista active.
	 * 
	 * @return
	 */
	public List<Leiturista> getLstLeiturista() {
		Query query = entityManager
				.createQuery("FROM Leiturista WHERE status=:status");

		query.setParameter("status", EnumStatus.ATIVO);

		return query.getResultList();
	}

	/**
	 * Validar o acesso do equipamento.
	 * 
	 * @param imei
	 * @return
	 * @throws AccessNaoAutorizadoException
	 */
	public boolean validarAcessoEquipamento(String imei) throws AccessNaoAutorizadoException {

		if (imei == null) {
			throw new AccessNaoAutorizadoException(
					"Equipamento informado não é válido, ou está desativado.");
		}

		return true;
	}

	/**
	 * Validar as crendiciais do usuário informado.
	 * 
	 * @param usuario
	 * @param senha
	 * @return
	 * @throws AccessNaoAutorizadoException
	 */
	public boolean validarAcessoUsuarioMobile(Long usuario, String senha) throws AccessNaoAutorizadoException {

		if (usuario == null || senha == null) {
			throw new AccessNaoAutorizadoException(
					"Credenciais não foram informadas para autenticação.");
		}

		return true;
	}

	/**
	 * Validar se o usuário está associado ao equipamento informado.
	 * 
	 * @param usuario
	 * @param senha
	 * @param imei
	 * @return
	 * @throws AccessNaoAutorizadoException
	 */
	public boolean validarAcessoEquipamentoUsuarioMobile(Long usuario,
			String senha, String imei) throws AccessNaoAutorizadoException {
		if (imei == null || usuario == null || senha == null) {
			throw new AccessNaoAutorizadoException(
					"Credenciais não foram informadas para autenticação.");
		}
		return true;
	}

	/**
	 * Buscar os dados para o usuário informado.
	 * 
	 * @param usuario
	 * @return
	 */
	public LeituristaVO buscarUsuarioMobile(Long usuario) {
		return null;
	}

}
